/**
 * 装饰器
 */
class Decorators {
	@MonitorValue()
	public listenerValue: any;
	public change() {
		console.log('xxxx');
	}
}
//装饰器方法只会在加载代码时执行一次，可以打印输出参数，调用被装饰的方法不会触发装饰器方法。
//方法修饰器
function watchChange(qwe: string) {
	return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
		console.log('11');
	};
}
//装饰器方法只会在加载代码时执行一次，可以打印输出参数，调用被装饰的属性不会触发装饰器方法。
//属性修饰器
function MonitorValue() {
	return function (target: any, propertyName: string) {
		//get方法
		let key = '_' + propertyName;
		let get;
		get = function () {
			return target[key];
		};
		//set方法
		let set;
		set = function (value: any) {
			console.log('vvvvvvvv');
			if (target[key] === value) return;
			let oldValue = target[key];
			target[key] = value;
			target['change']();
		};
		//属性设置
		Object.defineProperty(target, propertyName, {
			get: get,
			set: set,
			enumerable: true,
			configurable: true
		});
	};
}
export default Decorators;
